昨天介紹了 Falco 的安裝及原理,今天要來說明如何制定 Rule 以及 Output。
在 Rules 的部分主要透過 yaml 建立,主要含有以下三個 elements:
Element | 描述 |
---|---|
Rules | 主要提供規則的制定,可以設定哪些條件觸發 alert 以及告警強度,還有告警內容 |
Macros | 當一些規則內容重複時可以透過 Macros先定義並且重複使用 |
Lists | List 的使用上會比較像是 Rule 或者 Macros 內的小配置,可重複使用 |
範例:
這個規則的目的是:偵測在容器內啟動 bash 或 ksh shell 的行為,這可能表示有人正在容器內執行互動式操作,需要留意是否為未授權存取。
- rule: shell_in_container
desc: notice shell activity within a container
condition: >
evt.type = execve and
evt.dir = < and
container.id != host and
(proc.name = bash or
proc.name = ksh)
output: >
shell in a container |
user=%user.name container_id=%container.id container_name=%container.name
shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline
priority: WARNING
>
是將多行摺疊成一行執行 /bin/bash -c "python3 run.py"
會產生告警,執行時會產生兩個 execve 事件:
第一個事件(會觸發告警):
proc.name = bash
proc.cmdline = /bin/bash -c python3 run.py
結果:會觸發告警
第二個事件(不會觸發):
proc.name = python3
proc.cmdline = python3 run.py
結果:不會觸發告警
可先將 Condition 的條件作為範本並且取用
macro1: container
- macro: container
condition: container.id != host
macro2: spawned_process
- macro: spawned_process
condition: evt.type = execve and evt.dir = <
當 rule 建立時如果需要就可以直接取用,不用重新輸入
- rule: shell_in_container
desc: notice shell activity within a container
condition: >
spawned_process and # 不用輸入 evt.type = execve and evt.dir = <
container and # 不用輸入 condition: container.id != host
proc.name = bash
output:
priority:
可以為 list 或者 item,list中可以引用其他 list
- list: shell_binaries
items: [bash, csh, ksh, sh, tcsh, zsh, dash]
- list: userexec_binaries
items: [sudo, su]
- list: known_binaries
items: [shell_binaries, userexec_binaries]
- macro: safe_procs
condition: proc.name in (known_binaries)
Output 主要就是在 log 端需要顯示哪些訊息,可以按照需求做調整。
在考試時會需要透過 journalctl 查看 log
journalctl -u falco